<?php

namespace app\admin\controller;

use think\Controller;
use think\Db;
use app\common\service\SysLogService;

class Taskque extends Controller
{
    public function index()
    {
        // 获取请求数据
        $data = request()->put();
        
        // 参数验证
        if (empty($data['filePath']) || empty($data['name'])) {
            return json(['code' => 400, 'message' => '参数错误，缺少必要字段']);
        }
        
        $filePath = rtrim($data['filePath'], '/');
        
        // 验证文件夹存在
        if (!is_dir($filePath)) {
            return json(['code' => 400, 'message' => '文件夹不存在']);
        }

        // 使用事务确保数据一致性
        Db::startTrans();
        
        try {
            // 创建任务记录
            $taskId = Db::table('zstp_zip_task')->insertGetId([
                'name' => $data['name'],
                'file_path' => $filePath,
                'create_time' => date('Y-m-d H:i:s')
            ]);
            
            if (!$taskId) {
                throw new \Exception('任务创建失败');
            }
            
            // 扫描并添加zip文件
            $this->scanAndAddZipFiles($filePath, $taskId);

            $sysLogService = new SysLogService();
            
            $result =  $sysLogService->addLog('创建启动批处理任务id('. $taskId.')', $taskId, 1, '创建启动批处理任务id:'.$taskId);
            
            // 提交事务
            Db::commit();
            return json(['code' => 200, 'message' => '任务创建成功']);
            
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 400, 'message' => $e->getMessage()]);
        }
    }
    
    /**
     * 扫描并添加ZIP文件到队列
     * 
     * @param string $filePath 文件路径
     * @param int $taskId 任务ID
     * @return void
     */
    private function scanAndAddZipFiles($filePath, $taskId)
    {
        // 获取一级子目录
        $yearFolders = [];
        $items = scandir($filePath);
        
        foreach ($items as $item) {
            // 过滤掉.开头的文件夹和非目录项
            if (strpos($item, '.') === 0 || !is_dir($filePath . '/' . $item)) {
                continue;
            }
            $yearFolders[] = $item;
        }
        
        // 如果没有找到任何有效目录
        if (empty($yearFolders)) {
            throw new \Exception('未找到有效的子目录');
        }
        
        $totalZipFiles = 0;
        
        // 遍历每个年份文件夹
        foreach ($yearFolders as $yearFolder) {
            $yearPath = $filePath . '/' . $yearFolder;
            
            // 直接使用glob查找zip文件，性能更好
            $zipFiles = glob($yearPath . '/*.zip');
            
            if (empty($zipFiles)) {
                continue; // 此目录下没有zip文件，跳过
            }
            
            $batchInsert = [];
            foreach ($zipFiles as $zipFile) {
                $zipName = basename($zipFile);
                $batchInsert[] = [
                    'task_id' => $taskId,
                    'path' => $zipFile,
                    'zip_name' => $zipName,

                    'status' => 0 // 默认状态：未处理
                ];
            }
            
            // 批量插入，提高性能
            if (!empty($batchInsert)) {
                Db::table('zstp_zip_queue')->insertAll($batchInsert);
                $totalZipFiles += count($batchInsert);
            }
        }
        
        // 如果没有找到任何zip文件
        if ($totalZipFiles === 0) {
            throw new \Exception('未找到任何ZIP文件');
        }
        
        // 更新任务总文件数
        Db::table('zstp_zip_task')
            ->where('id', $taskId)
            ->update(['total_files' => $totalZipFiles]);
    }
}